package org.spring.blog.controller.portal;


import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.spring.blog.response.ResponseResult;
import org.spring.blog.response.ResponseState;
import org.spring.blog.service.IArticleService;
import org.spring.blog.service.ICategoryService;
import org.spring.blog.utils.LRConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/portal/article")
public class ArticlePortalApi {

    @Autowired
    private ICategoryService categoryService;

    @Autowired
    private IArticleService articleService;


    /**
     * 获取分类信息的方法
     *
     * @return 自定义返回对象
     */
    @ApiOperation("获取分类信息的方法")
    @ApiResponses(@ApiResponse(code = ResponseState.success_code, message = ResponseState.success_message))
    @GetMapping("/categories")
    public ResponseResult getCategories() {
        return categoryService.listCategories();
    }

    /**
     * 获取文章列表
     * 权限 所有人 包括游客
     * 状态： article.state = LrConstant.db_default_status
     *
     * @param page 页码
     * @param size 页面大小
     * @return 自定义返回对象
     */
    @ApiOperation("获取不需要权限的文章列表")
    @GetMapping("/list/{page}/{size}")
    public ResponseResult listArticle(@PathVariable("page") int page, @PathVariable("size") int size) {
        return articleService.list(page, size, null, null, LRConstants.db_publish_status);
    }

    /**
     * 根据分类获取文章列表
     *
     * @param categoryId 分类id
     * @param page       页码
     * @param size       页面大小
     * @return 自定义返回对象
     */
    @ApiOperation("根据文章分类获取文章列表")
    @GetMapping("/list/{categoryId}/{page}/{size}")
    public ResponseResult listArticleByCategory(@PathVariable("categoryId") String categoryId, @PathVariable("page") int page, @PathVariable("size") int size) {
        return articleService.list(page, size, null, categoryId, LRConstants.db_publish_status);
    }

    /**
     * 获取文章详情
     *
     * @param articleId 文章id
     * @return 自定义返回对象
     */
    @ApiOperation("获取文章详情")
    @ApiResponses({
            @ApiResponse(code = ResponseState.user_not_login_code, message = ResponseState.user_not_login_message),
            @ApiResponse(code = ResponseState.not_support_operation_code, message = ResponseState.not_support_operation_message),
            @ApiResponse(code = ResponseState.data_not_have_code, message = ResponseState.data_not_have_message),
            @ApiResponse(code = ResponseState.success_code, message = ResponseState.success_message),
    })
    @GetMapping("/{articleId}")
    public ResponseResult getArticleDetail(@PathVariable("articleId") String articleId) {
        return articleService.queryById(articleId);
    }

    /**
     * 获取相关推荐文章的接口
     * 通过文章中的 标签 来给用户推荐文章
     * 相关的文章但不要一样， 安卓不要在推荐安卓
     * 可以推荐一下 linux 这样相关的 操作系统
     * <p>
     * 如果没有相关文章 则获取最新的文章
     *
     * @param articleId 文章id
     * @return 自定义返回对象
     */
    @ApiOperation("获取相关推荐文章的接口")
    @GetMapping("/recommend/{articleId}/{size}")
    public ResponseResult getRecommendArticles(@PathVariable("articleId") String articleId,
                                               @PathVariable int size) {
        return articleService.listRecommendArticle(articleId, size);
    }

    /**
     * 获取置顶的文章列表
     *
     * @param page 页码
     * @param size 页面大小
     * @return 自定义返回对象
     */
    @ApiOperation("获取置顶的文章列表")
    @GetMapping("/top/{page}/{size}")
    public ResponseResult getTopArticle(@PathVariable("page") int page, @PathVariable("size") int size) {
        return articleService.list(page, size, null, null, IArticleService.constant.db_top_state_article);
    }

    /**
     * 根据标签获取文章列表
     *
     * @param page  页码
     * @param size  页面大小
     * @param label 标签
     * @return 自定义返回对象
     */
    @ApiOperation("根据标签获取文章列表")
    @GetMapping("/list/label/{label}/{page}/{size}")
    public ResponseResult listArticleByLabel(@PathVariable("page") int page,
                                             @PathVariable("size") int size,
                                             @PathVariable String label) {
        return articleService.listArticleByLabel(page, size, label);
    }

    /**
     * 查询标签云
     *
     * @param size 数量
     * @return 自定义返回对象
     */
    @ApiOperation("查询标签云")
    @GetMapping("/label/{size}")
    public ResponseResult listLabels(@PathVariable("size") int size) {
        return articleService.listLabels(size);
    }
}
